package collections_;

import java.util.*;

/**
 * @author DCSGO
 * @version 1.0
 * Collections 是一个操作 Set List 和 Map
 * 等集合的工具类(抽象类) 下面演示其常用方法(均为静态方法)
 * 补充：抽象类 约等于 普通类 + 抽象方法
 * 抽象类中的抽象方法不能有方法体(方法的具体实现代码)
 * 接口中的方法(默认是抽象方法)若没用 default 修饰也不能有方法体
 */

@SuppressWarnings({"all"})
public class CollectionsMethod {
    public static void main(String[] args) {
        //1.reverse(List): 反转 List 中元素的顺序(逆置)
        List list = new ArrayList();
        list.add("1");
        list.add("2");
        list.add("3");
        System.out.println(list);//[1, 2, 3]

        Collections.reverse(list);
        System.out.println(list);//[3, 2, 1]

        //2.shuffle(List): 对 List 中的元素进行随机排序
        for (int i = 0; i < 10; i++) {
            list.add(i);
        }
        for (int i = 0; i < 3; i++) {
            Collections.shuffle(list);
            System.out.println(list);
        }
        //[0, 5, 2, 8, 9, 4, 1, 3, 2, 6, 3, 1, 7]
        //[2, 3, 5, 1, 1, 7, 4, 6, 3, 0, 8, 9, 2]
        //[4, 7, 3, 8, 6, 2, 1, 0, 9, 1, 5, 2, 3]

        //3.sort(List): 根据元素的自然顺序对指定的 List 集合元素按升序排序
        list.remove("1");
        list.remove("2");
        list.remove("3");
        //元素间若不能直接进行比较将会抛出异常
        //ClassCastException: java.lang.String cannot be cast to java.lang.Integer
        Collections.sort(list);
        System.out.println(list);
        //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

        //4.sort(List,Comparator) 根据指定的比较器将集合进行排序
        Collections.sort(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                int num1 = (int) o1;
                int num2 = (int) o2;
                if (num1 == num2 || num1 % 2 == num2 % 2) {
                    return 0;//相等 或 都为偶数 或 都为奇数
                } else if (num1 % 2 != 0) {
                    return 1;//num1 为奇数
                } else {
                    return -1;//num1 不为奇数
                }
            }
        });
        System.out.println(list);
        //[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]

        //5.swap(List,int,int): 将指定 List 集合中的 i 处元素
        //  和 j 处元素进行交换 当然不能越界啦
        Collections.swap(list, list.indexOf(2), list.indexOf(5));
        System.out.println(list);
        //[0, 5, 4, 6, 8, 1, 3, 2, 7, 9]

        //1. Object max(Collection): 根据元素的自然顺序 返回给定集合中的最大元素
        System.out.println(Collections.max(list));//9

        //2.Object max(Collection,Comparator): 根据比较器 返回集合中的最大元素
        //即能被3整除又能被5整除的最大值 [0 9]
        System.out.println(Collections.max(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                int num1 = (int) o1;
                int num2 = (int) o2;
                if (num1 == num2) {
                    return 0;
                } else if (num1 % 3 == num2 % 3 && num1 % 5 == num2 % 5) {
                    return num1 - num2;
                } else if (num1 % 3 == 0 && num1 % 5 == 0) {
                    return 1;
                } else if (num2 % 3 == 0 && num2 % 5 == 0) {
                    return -1;
                } else {
                    return num1 - num2;
                }
            }
        }));//0

        //3.Object min(Collection)
        System.out.println(Collections.min(list));//0

        //即能被3整除又能被5整除的最小值 [0 9]
        System.out.println(Collections.max(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                int num1 = (int) o1;
                int num2 = (int) o2;
                if (num1 == num2) {
                    return 0;
                } else if (num1 % 3 == num2 % 3 && num1 % 5 == num2 % 5) {
                    return num1 - num2;
                } else if (num1 % 3 == 0 && num1 % 5 == 0) {
                    return 1;
                } else if (num2 % 3 == 0 && num2 % 5 == 0) {
                    return -1;
                } else {
                    return num1 - num2;
                }
            }
        }));//0
        //int frequency(Collection,Object): 返回集合中指定元素的出现次数
        list.add(1);
        list.add(1);
        System.out.println(Collections.frequency(list, 1));//3

        //6.void copy(List dest,List src): 将 src 中的内容复制到 dest 中
        //  dest.size >= src.size 注意是元素个数而不是容量
        List list1 = new ArrayList();
        for (int i = 0; i < list.size(); i++) {
            list1.add(1);
        }
        Collections.copy(list1, list);
        System.out.println("list= " + list);
        System.out.println("list1=" + list1);
        //list= [0, 5, 4, 6, 8, 1, 3, 2, 7, 9, 1, 1]
        //list1=[0, 5, 4, 6, 8, 1, 3, 2, 7, 9, 1, 1]

        //7.boolean replaceAll(List list,Object odlVal,Object newVal)
        //  使用新值替换 List 对象中的所有旧值
        Collections.replaceAll(list, 1, 666);
        System.out.println(list);
        //[0, 5, 4, 6, 8, 666, 3, 2, 7, 9, 666, 666]
    }
}
